package com.wenzi;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class CompositePicture {
    public static void main(String[] args){
        try {
            InputStream in = new FileInputStream("D:\\图片素材\\210929\\aa\\2.png");
            CompositePicture.compositePicture("D:\\图片素材\\210929\\testResult\\",15L,in,"黄益洪","hyh",32);
        }catch (Exception e){

        }

    }
    /**
     *
     * @param path  加载背景图片的地址
     * @param documentId  我的研报的标识 用于合成新图的名称        这个大家可根据自己的需要是否传参都可
     * @param inputStream  微信小程序二维码的 输入流  不知如何生成微信小程序的可以  上微信开发者api上看  或者网上找资源即可
     * @param title 研报标题   就是要在背景图上展示的文字   大家根据自己的需求可替换成用户名或者别的
     * @param authorNameAndDate 研报作者  也是要在背景图上展示的文字  大家根据自己的需求可替换成用户名或者别的
     * @param fontSize 字体的大小
     * @return
     */
    public static String compositePicture(String path, Long documentId, InputStream inputStream, String title, String authorNameAndDate, int fontSize) {
        String originalFilename = documentId+".png";
        try {
            // 加载背景图片
            BufferedImage imageLocal = ImageIO.read(new File(path + "14.png"));
            int srcImgWidth = imageLocal.getWidth(null);
            int srcImgHeight = imageLocal.getHeight(null);
            System.out.println("0000");
            // 加载微信小程序二维码并转换为BufferedImage
            BufferedImage imageCode = ImageIO.read(inputStream);
            // 以背景图片为模板
            Graphics2D g = imageLocal.createGraphics();
            // 消除文字锯齿
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            // 在模板上添加用户二维码(地址,左边距,上边距,图片宽度,图片高度,未知)
            g.drawImage(imageCode, 367, imageLocal.getHeight() - 170, 150, 150, null);
            Font font1 = new Font("微软雅黑", Font.BOLD, fontSize);// 添加字体的属性设置
            g.setFont(font1);
            Color color1 = new Color(100,0,0);
            g.setColor(color1);

            String waterMarkContent = title;
            // 截取研报标题 如: 科技：MWC：5G和边缘计算设备设计生产思路更加明确      展示为   科技：
            g.drawString(waterMarkContent.substring(0,waterMarkContent.indexOf("：")+1),20,200);
            // 截取研报标题 如: 科技：MWC：5G和边缘计算设备设计生产思路更加明确      展示为   MWC：5G和边缘计算设备设计生产思路更加明确
            waterMarkContent=waterMarkContent.substring(waterMarkContent.indexOf("：")+1);
            // 获取水印文字总长度
            int fontlen = getWatermarkLength(waterMarkContent, g);
            int line = fontlen / srcImgWidth;// 文字长度相对于图片宽度应该有多少行

            // 文字叠加,自动换行叠加
            int tempX = 20;
            int tempY = 260;
            int tempCharLen = 0;// 单字符长度
            int tempLineLen = 0;// 单行字符总长度临时计算
            System.out.println("水印文字总长度:" + fontlen + ",图片宽度:" + srcImgWidth + ",图片高度:" + srcImgHeight+ ",字符个数:" + waterMarkContent.length()+ ",文字行数:" + line+",x初始坐标:" + tempX+",y初始坐标:" + tempY);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < waterMarkContent.length(); i++) {
                char tempChar = waterMarkContent.charAt(i);
                tempCharLen = getCharLen(tempChar, g);//获取标题长度

                if ((tempLineLen) >= srcImgWidth) {
                    g.drawString(sb.toString(), tempX, tempY);// 长度已经满一行,进行文字叠加

                    sb.delete(0, sb.length());// 清空内容,重新追加

                    tempY += fontSize+10;// 长度已经满一行,Y的位置加10字符高度

                    tempLineLen =0;
                }
                sb.append(tempChar);// 追加字符
                tempLineLen += tempCharLen;
            }
            g.drawString(sb.toString(), tempX, tempY);// 最后叠加余下的文字
            Font font2 = new Font("微软雅黑", Font.PLAIN, 23);// 添加字体的属性设置
            g.setFont(font2);
            Color color2 = new Color(255,255,255);
            g.setColor(color2);
            g.drawString(authorNameAndDate,20, imageLocal.getHeight() - 220);
            g.dispose();

            // 完成模板修改
            g.dispose();
            // 判断新文件的地址路径是否存在，如果不存在就创建一个
            System.out.println(path+originalFilename);
            File outputfile = new File(path+originalFilename);
            if (!outputfile.getParentFile().exists()) {
                outputfile.getParentFile().mkdirs();
            }
            // 生成新的合成过的用户二维码并写入新图片
            ImageIO.write(imageLocal, "png", outputfile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(originalFilename);
        return originalFilename;
    }

    /**
     *
     * @param c 需要写在背景图上的字符串
     * @param g Graphics2D java 合成图片 写字的处理对象
     * @return
     */
    public static int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c)+3;
    }

    /**
     * 获取水印文字总长度
     *
     * @paramwaterMarkContent水印的文字
     * @paramg
     * @return水印文字总长度
     */
    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

}
